package Singleto;
//双重校验模式 试图降低内存开销

public class Singleto4 {
    //volatile防止指令重排  java编译的时候对代码进行优化
    private static volatile Singleto4 INSTANCE;

    private Singleto4(){}
    // 加synchronized关键字 保证了操作的原子性
    public static  Singleto4 getInstance(){
        if (INSTANCE == null) {   //此处可能有多个线程进入if判断 这个左右时防止多余的锁
            synchronized (Singleto4.class) {    //给方法加锁降低系统开销
                if (INSTANCE == null) {    //双重校验 保证一个线程执行的时候,如果有了就返回原来的INSTANCE 这次判定就类似于饿汉式的判定
                    try {
                        Thread.sleep(1);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    INSTANCE = new Singleto4();
                }
            }
        }
        return INSTANCE;
    }
    public void m(){
        System.out.println("m");
    }

    public static void main(String[] args) {
        for(int i=1;i<100;i++){
            new Thread(()->{
                System.out.println(Singleto4.getInstance().hashCode());
            }).start();
        }
    }
}
